/* 将空格替换为'%20' */
#include<stdio.h>
#include<malloc.h>

/* 返回字符串除去'\0'部分的长度 */
int len(const char *str){
    int len=0;
    while(*(str+len)!='\0')
        len++;
    return len;
}

char* string_replace(char *str){
    int L=len(str);
    int space_count=0;//保存空格的数量
    for(int i=0;i<L;i++){
        if(str[i]==' ')
            space_count++;
    }

    int L2=L+2*space_count+1;
    char *newStr=(char *)malloc(L2);
    /*
        malloc分配的内存来自于堆，操作系统有一个记录空闲内存空间地址的链表，
        当操作系统收到程序申请时，会遍历这个链表，返回第一个空间大于申请空间的堆结点，
        并将此结点从空闲空间中删除。
    */
    if(newStr==NULL)
        return NULL;

    *(newStr+L2-1)='\0';

    int p1,p2;
    for(p1=L-1,p2=L2-2;p1>=0 && p2>=0;){
        if(*(str+p1)!=' '){
            *(newStr+(p2--))=*(str+(p1--));
        }else{
            *(newStr+(p2--))='0';
            *(newStr+(p2--))='2';
            *(newStr+(p2--))='%';
            p1--;
        }
    }

    return newStr;
}

void main(void){
    char *str="Hello world world";
    printf("%s\n",string_replace(str));
}